// acwing.291蒙德里安的梦想
#include<bits/stdc++.h>
using namespace std;

const int N = 12, M = 1 << N;
bool st[M];
long long f[N][M];

int main() 
{
    int n, m;
    while (cin >> n >> m && (m || n)) 
    {
        // 预处理所有状态的情况
        for (int i = 0; i < 1 << n; i ++ )
        {
            // cnt为当前已经存在多少个连续的0
            int cnt = 0;
            st[i] = true;
            // 遍历这个数字（当前状态）的所有位
            for (int j = 0; j < n; j ++ ) 
                // 如果当前位 为1
                if (i >> j & 1)
                {
                    // 且cnt为奇数说明 当前状态错误
                    if (cnt & 1) 
                    {
                        st[i] = false;
                        continue;
                    }
                    else cnt = 0; // 说明是偶数 cnt置0 继续扫描
                }
                else cnt ++;
            if (cnt & 1) st[i] = false;
        }
        memset(f, 0, sizeof f);
        f[0][0] = 1;
        // 遍历每一列
        for (int i = 1; i <= m; i ++)
            // 遍历当前列的所有状态
            for (int j = 0; j < 1 << n; j ++ )
                // 遍历前一列的所有状态
                for (int k = 0; k < 1 << n; k ++ )
                    // j & k == 0 表示 i 列和 i - 1列同一行不同时捅出来
                    // st[j | k] == 1 表示 在 i 列状态 j， i - 1 列状态 k 的情况下是合法的.
                    if ((j & k) == 0 && (st[j | k]))
                        f[i][j] += f[i - 1][k];
        cout << f[m][0] << endl;
    }
    return 0;
}
